共计 3049 个字符,预计需要花费 8 分钟才能阅读完成。
要从经过动态渲染的网页中爬取数据,需要使用 Selenium 库打开一个模拟浏览器访问网页,然后获取渲染后的网页源代码。
实战中通常和 Requests 库结合使用,实现优势互补。如果用 Requests 库能获取到需要的网页源代码,那么优先使用 Requests 库进行爬取;如果用 Requests 库获取不到,再使用 Selenium 库进行爬取。
Selenium 安装
谷歌浏览器
首先查看谷歌浏览器的版本号。单击谷歌浏览器右上角的 ⋮ 按钮,在弹出的菜单中执行 帮助 -> 关于 Google Chrome,在弹出的页面中查看所安装的谷歌浏览器的版本号。
接着下载安装包:
- 官方下载地址:https://chromedriver.chromium.org/downloads
- 镜像下载地址:https://registry.npmmirror.com/binary.html?path=chromedriver
找到与自己谷歌浏览器最接近的的版本,下载对应当前操作系统的安装包。
注意:Chrome 推送新版本更新要小心,因为一不小心点了升级,再运行之前写的程序,就会出现 Chrome 与 chromedriver 版本不一致的问题,导致程序无法正常运行。
最后,安装 ChromeDriver:将下载好的文件解压缩,得到可执行文件“chromedriver.exe”,将其复制到 Python 安装路径下的“Scripts”文件夹中。建议把 ChromeDriver 安装到 Python 的安装路径下,从而让 Python 能更容易地调用 ChromeDriver。
Python 安装路径查询:在命令行窗口中输入 where python
后回车,即可看到 Python 的安装路径。
在命令行窗口中输入 chromedriver
后回车,没有报错就说明 ChromeDriver 安装成功了。
火狐浏览器
geckodriver 下载地址:https://github.com/mozilla/geckodriver/releases/
安装 geckodriver:将下载好的文件解压缩,得到可执行文件“geckodriver.exe”,将其复制到 Python 安装路径下的“Scripts”文件夹中。建议把 geckodriver 安装到 Python 的安装路径下,从而让 Python 能更容易地调用 geckodriver。
验证安装
运行以下代码,能够打开浏览器,就说明安装成功了:
from selenium.webdriver import Chrome
browser = Chrome()
url = "https://www.xinpianchang.com/a12867560"
browser.get(url)
浏览器选项设置
在上面验证安装的时候,我们发现 Selenium 打开谷歌浏览器运行完后,浏览器就自动关闭了,都没看清楚。
这时,需要进行浏览器选项设置,向浏览器添加一些实验性功能选项。
from selenium import webdriver
# 打开自定义配置
options = webdriver.ChromeOptions()
# 设置浏览器不会关闭
options.add_experimental_option("detach", True)
# 禁用浏览器扩展
options.add_argument("--disable-extensions")
# 禁用浏览器弹窗
options.add_argument("--disable-popup-blocking")
# 设置浏览器 UA
options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
)
browser = webdriver.Chrome(options=options)
browser.maximize_window()
url = "https://www.xinpianchang.com/a12867560"
browser.get(url)
常用 API
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as ec # 该模块收集了一系列的场景判断方法
from selenium.webdriver.support.wait import WebDriverWait # 显示等待
# 打开自定义配置
options = webdriver.ChromeOptions()
# 设置浏览器不会关闭
options.add_experimental_option("detach", True)
browser = webdriver.Chrome(options=options)
url = "https://www.xinpianchang.com/a12867560"
browser.get(url) # 打开页面
url2 = "https://www.baidu.com/"
browser.get(url2)
browser.back() # 后退
browser.forward() # 前进
element = browser.find_element("id", "kw") # 找到页面中的元素
element.send_keys("爬虫") # 向输入框发送值
element2 = browser.find_element("id", "su")
element2.click() # 点击按钮
wait = WebDriverWait(browser, 30) # 最长等待时间为 30 秒
# 判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见
wait.until(ec.presence_of_element_located(("id", "content_left")))
content = browser.page_source # 获取页面内容
browser.close() # 关闭页面
Cookie
from selenium import webdriver
import json
# 打开自定义配置
options = webdriver.ChromeOptions()
# 设置浏览器不会关闭
options.add_experimental_option("detach", True)
browser = webdriver.Chrome(options=options)
url = "https://www.baidu.com/"
browser.get(url)
# 手动登录,登录后提取 cookie
cookies = browser.get_cookies()
cookies_str = json.dumps(cookies) # 序列化
with open("cookies.txt", "w", encoding="utf-8") as f:
f.write(cookies_str)
with open("cookies.txt", "r", encoding="utf-8") as f:
cookies_str = f.read()
cookies = json.loads(cookies_str)
# 向浏览器注入 cookie
for cookie in cookies:
try:
browser.add_cookie(cookie)
except Exception as e:
print(e)
browser.get(url)